/*
    SUSAN® - Sole of Unix Save ANything

   Copyright (C) 2006-2006 Hechzh Property
   Copyright (C) 2016-2016 Skyatlas Co. CN

   
*/

/*
 * Taken from the public domain ansitape program for
 *   integration into Susan. KES - Mar 2005
 */
/**
 * @file
 * ebcdic <-> ascii conversion routines
 */

namespace storagedaemon {

/* Mapping of EBCDIC codes to ASCII equivalents. */
static char to_ascii_table[256] = {
    '\000', '\001', '\002', '\003', '\234', '\011', '\206', '\177', '\227',
    '\215', '\216', '\013', '\014', '\015', '\016', '\017', '\020', '\021',
    '\022', '\023', '\235', '\205', '\010', '\207', '\030', '\031', '\222',
    '\217', '\034', '\035', '\036', '\037', '\200', '\201', '\202', '\203',
    '\204', '\012', '\027', '\033', '\210', '\211', '\212', '\213', '\214',
    '\005', '\006', '\007', '\220', '\221', '\026', '\223', '\224', '\225',
    '\226', '\004', '\230', '\231', '\232', '\233', '\024', '\025', '\236',
    '\032', '\040', '\240', '\241', '\242', '\243', '\244', '\245', '\246',
    '\247', '\250', '\133', '\056', '\074', '\050', '\053', '\041', '\046',
    '\251', '\252', '\253', '\254', '\255', '\256', '\257', '\260', '\261',
    '\135', '\044', '\052', '\051', '\073', '\136', '\055', '\057', '\262',
    '\263', '\264', '\265', '\266', '\267', '\270', '\271', '\174', '\054',
    '\045', '\137', '\076', '\077', '\272', '\273', '\274', '\275', '\276',
    '\277', '\300', '\301', '\302', '\140', '\072', '\043', '\100', '\047',
    '\075', '\042', '\303', '\141', '\142', '\143', '\144', '\145', '\146',
    '\147', '\150', '\151', '\304', '\305', '\306', '\307', '\310', '\311',
    '\312', '\152', '\153', '\154', '\155', '\156', '\157', '\160', '\161',
    '\162', '\313', '\314', '\315', '\316', '\317', '\320', '\321', '\176',
    '\163', '\164', '\165', '\166', '\167', '\170', '\171', '\172', '\322',
    '\323', '\324', '\325', '\326', '\327', '\330', '\331', '\332', '\333',
    '\334', '\335', '\336', '\337', '\340', '\341', '\342', '\343', '\344',
    '\345', '\346', '\347', '\173', '\101', '\102', '\103', '\104', '\105',
    '\106', '\107', '\110', '\111', '\350', '\351', '\352', '\353', '\354',
    '\355', '\175', '\112', '\113', '\114', '\115', '\116', '\117', '\120',
    '\121', '\122', '\356', '\357', '\360', '\361', '\362', '\363', '\134',
    '\237', '\123', '\124', '\125', '\126', '\127', '\130', '\131', '\132',
    '\364', '\365', '\366', '\367', '\370', '\371', '\060', '\061', '\062',
    '\063', '\064', '\065', '\066', '\067', '\070', '\071', '\372', '\373',
    '\374', '\375', '\376', '\377'};


/* Mapping of ASCII codes to EBCDIC equivalents. */
static char to_ebcdic_table[256] = {
    '\000', '\001', '\002', '\003', '\067', '\055', '\056', '\057', '\026',
    '\005', '\045', '\013', '\014', '\015', '\016', '\017', '\020', '\021',
    '\022', '\023', '\074', '\075', '\062', '\046', '\030', '\031', '\077',
    '\047', '\034', '\035', '\036', '\037', '\100', '\117', '\177', '\173',
    '\133', '\154', '\120', '\175', '\115', '\135', '\134', '\116', '\153',
    '\140', '\113', '\141', '\360', '\361', '\362', '\363', '\364', '\365',
    '\366', '\367', '\370', '\371', '\172', '\136', '\114', '\176', '\156',
    '\157', '\174', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
    '\310', '\311', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
    '\330', '\331', '\342', '\343', '\344', '\345', '\346', '\347', '\350',
    '\351', '\112', '\340', '\132', '\137', '\155', '\171', '\201', '\202',
    '\203', '\204', '\205', '\206', '\207', '\210', '\211', '\221', '\222',
    '\223', '\224', '\225', '\226', '\227', '\230', '\231', '\242', '\243',
    '\244', '\245', '\246', '\247', '\250', '\251', '\300', '\152', '\320',
    '\241', '\007', '\040', '\041', '\042', '\043', '\044', '\025', '\006',
    '\027', '\050', '\051', '\052', '\053', '\054', '\011', '\012', '\033',
    '\060', '\061', '\032', '\063', '\064', '\065', '\066', '\010', '\070',
    '\071', '\072', '\073', '\004', '\024', '\076', '\341', '\101', '\102',
    '\103', '\104', '\105', '\106', '\107', '\110', '\111', '\121', '\122',
    '\123', '\124', '\125', '\126', '\127', '\130', '\131', '\142', '\143',
    '\144', '\145', '\146', '\147', '\150', '\151', '\160', '\161', '\162',
    '\163', '\164', '\165', '\166', '\167', '\170', '\200', '\212', '\213',
    '\214', '\215', '\216', '\217', '\220', '\232', '\233', '\234', '\235',
    '\236', '\237', '\240', '\252', '\253', '\254', '\255', '\256', '\257',
    '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', '\270',
    '\271', '\272', '\273', '\274', '\275', '\276', '\277', '\312', '\313',
    '\314', '\315', '\316', '\317', '\332', '\333', '\334', '\335', '\336',
    '\337', '\352', '\353', '\354', '\355', '\356', '\357', '\372', '\373',
    '\374', '\375', '\376', '\377'};


/**
 * Convert from ASCII to EBCDIC
 */
void AsciiToEbcdic(char* dst, char* src, int count)
{
  while (count--) { *dst++ = to_ebcdic_table[0377 & *src++]; }
}


/**
 * Convert from EBCDIC to ASCII
 */
void EbcdicToAscii(char* dst, char* src, int count)
{
  while (count--) { *dst++ = to_ascii_table[0377 & *src++]; }
}

} /* namespace storagedaemon */
